繁体   English   中英

python中的变量范围不一致

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM