python 字符串默认是全局的

标签 python string scope global

我有一个关于 Python 中的全局变量的问题。 代码如下。如果我在功能测试中不使用全局 M, 它会发出错误。 但是为什么它不显示字符串 s 的错误。我没有宣布它是全局性的。

global M
M = []
s = "abc"

def test():
    ### global M
    print M 
    M.append(s)

打印M UnboundLocalError:赋值前引用了局部变量“M”

最佳答案

If I do not use global M in function test, It would issue error.

你的这个说法根本是真的!!!

>>> M = []
>>> s = "abc"
>>> 
>>> def test():
...     M.append(s)
... 
>>> M
[]
>>> test()
>>> M
['abc']

我认为您混淆了两个完全不同的概念:

  1. 绑定(bind)裸名——通常通过赋值(即=),但也可能 通过一些其他语句 (def, &c)

  2. 调用方法(例如append)“可能”碰巧改变对象 (仅当该对象是可变的并且该方法当然是一个变元时,但是 当对象是一个列表并且方法是 append)

  3. 时确实适用

我不确定为什么人们会混淆这两个截然不同的概念,但他们肯定会。也许是一些非普通的“类型”的赋值实际上是在“幕后”调用一个(特殊的)方法,例如,分配给限定名称(a.b=c 实际上是在调用type(a).__setitem__(a, b),因此,调用方法,不重新绑定(bind)任何裸名)和扩充赋值(a+=b 实际上是在做 a = type(a).__iadd__(a, b),所以,两者 调用方法 重新绑定(bind)裸名)。

当且仅当您执行“1”时,您才需要 global(唉):重新绑定(bind)一个裸名(包括通过增强分配重新绑定(bind)它,但包括任何其他特例)。避免 global,除非它真的不可或缺(许多人会说它永远真正不可或缺...在某些情况下只是“显然有点方便”;-)。

关于python 字符串默认是全局的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3840349/

相关文章:

javascript - 是否可以在 JavaScript 中调用另一个函数中本地定义的函数?

scope - SSAS MDX 脚本 - 作用于层次结构的所有成员,[All] 成员除外

python - peewee 自定义字段 - 定义允许值

python - 为什么将整数转换为字符串,将其切片,然后再转换回整数,这给我带来TypeError吗?

string - 如何在源代码中跨多行编写单行字符串文字

java - for 循环计算字符串中重复的字符数,然后删除重复的字符

c++ - 在函数内部使用裸括号是一种好习惯吗?

javascript - Flask 和 gevent 的 CORS 错误

python - 有效地更新Python中列表列表中特定位置的元素

c++ - 为什么 VS UnitTesting 框架中的 Assert::AreEqual 不能与 std::string 一起使用?