我是靠谱客的博主 帅气香水,最近开发中收集的这篇文章主要介绍Python中变量的作用域与可变、不可变类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我们来看下面两个栗子

栗1:

def func1():

    a = 1

return a

func1()

print(a + 1)

运行时报错:

NameError: name 'a' is not defined

 

栗2:

b = 2

def func2():

    b += 2

print(b)

func2()

运行时报错:

UnboundLocalError: local variable 'b' referenced before assignment

 

对于栗1,向控制台输出a+1时显示a未被定义;而2中显示局部变量b在引用前未被赋值。出现这两种结果的原因是Python中变量的作用域导致的。

Python中变量按照其作用域可以分为局部变量和全局变量。

局部变量 定义在函数体内部的变量叫做局部变量,当函数调用结束后,局部变量被销毁,因此局部变量只在函数内部生效。对于栗1,当函数func1调用结束后,局部变量a被销毁,因此在函数外在此使用a时会报错。

全局变量 在函数体内外均能生效的变量叫做全局变量。函数体内部也能使用外部定义的全局变量,但不能在不声明的情况下对全局变量的值进行修改,栗2没有声明就修改了全局变量的值,故报错。那么,如何在函数体内修改全局变量的值呢?答案就是global函数。对于栗2,只需要在修改全局变量之前,用global b声明b是一个全局变量,即可在函数体内对b进行修改。

在Python中,值是靠引用来传递来的。我们可以用id() 来判断两个变量是否为同一个值的引用。我们可以将id值理解为对应内存的地址标识。我们通过两个栗子来引入可变与不可变类型

栗3:

m = 1

n = m

print(id(m))

print(id(n))

# 修改m的值

m = 2

print(m)

print(n)

print(id(m))

print(id(n))

运行结果为:

2143673542960

2143673542960

2

1

2143673542992

2143673542960

 

栗4:

list1 = [1, 3, 5, 7]

list2 = list1

print(id(list1))

print(id(list2))

# 修改list1,为其增加一个元素

list1.append(9)

print(list1)

print(list2)

print(id(list1))

print(id(list2))

运行结果为:

3010563511104

3010563511104

[1, 3, 5, 7, 9]

[1, 3, 5, 7, 9]

3010563511104

3010563511104

对于上述栗3,m,n均为整型,且值相等,其id值也相等,当我们将2赋值给m时其id发生变化,且不影响n的值和id;而对于栗4,list1和list2均为列表,list2由list1复制而来,其id和值均相等,当我们向list1中增加一个元素时,list1的id并未发生改变,list2的的id也未发生改变,但起值也发生了和list1相同的改变。

       所谓可变类型与不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变。

可变类型:列表、字典、集合

不可变类型:整型、浮点型、字符串、元组。

最后

以上就是帅气香水为你收集整理的Python中变量的作用域与可变、不可变类型的全部内容,希望文章能够帮你解决Python中变量的作用域与可变、不可变类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部