[英]inconsistent variable scope in python
似乎字符串和字典在python中的行为根本不同。 当我将字符串传递给函数时,仅在本地函数的作用域内对其进行修改,但是当我对dict进行相同操作时,它将在函数之外的作用域内进行修改:
def change_str(s):
s += " qwe"
def change_arr(a):
a[1] = "qwe"
ss = "asd"
change_str(ss)
print ss
# prints:
# asd
aa = {0:"asd"}
change_arr(aa)
print aa
# prints:
# {0: 'asd', 1: 'qwe'}
这是故意的吗?如果是,那为什么呢?
这是故意行为。 字符串在python中是不可变的,因此基本上所有的字符串操作都返回一个新字符串,并且由于您的函数不返回任何内容,因此您看不到新字符串asd qwe
。 您可以在本地范围之外更改可变容器的内容,而无需声明它们是全局的。
您可以在pythons 数据模型的官方文档中阅读有关可变类型的更多信息。
是的,这是故意的。 每种类型决定操作员如何处理它。 设置了dict类型,以便a[1] = "qwe"
修改dict对象。 此类更改将在引用该对象的任何代码段中看到。 string类型设置,使s += "qwe"
不修改对象,但返回一个新的对象。 因此,其他引用原始对象的代码将保持不变。
简而言之就是字符串是不可变的,字典是可变的。 但是,值得注意的是,“命令是易变的”并不是行为发生的全部原因。 原因是项目分配( someDict[item] = val
)是一种操作,它实际上是对dict进行突变。
不要让“分配”操作员欺骗您。 这是每个函数中真正发生的事情:
def change_str(s):
# operation has been split into 2 steps for clarity
t = s.__iadd__("qwe") # creates a new string object
s = t # as you know, without the `global` keyword, this `s` is local.
def change_arr(a):
a.__setitem__(1, "qwe")
如您所见,这些功能中只有一个具有分配操作。 []=
是.__setitem__()
简写。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.