概述
我们来看下面两个栗子
栗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中变量的作用域与可变、不可变类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复