【问题标题】:why this local parameter can change global parameter?为什么这个局部参数可以改变全局参数?
【发布时间】:2022-12-08 08:03:14
【问题描述】:

为什么 aaa无法更改 但 bbb可以改吗?


aaa = 100
def plus():
    aaa = 8   #aaa=8

plus()
print(f"aaa = {aaa}")   #aaa = 100



bbb = [100,8]
def plus2():
    bbb[0] = 5   #bbb=[5, 8]

plus2()
print(f"bbb = {bbb}")   #bbb = [5, 8]

谢谢你。 我希望你能明白我的意思。

【问题讨论】:

    标签: python global local


    【解决方案1】:

    当在函数内发现任何赋值 (variable = ...) 表达式时,该变量在函数内有其自己的局部作用域。所以 plus 中的变量 aaa 指的是与全球的aaa

    在后一种情况下 plus2,您不在本地分配 bbb,因此此处的 bbb 变量将引用全局 bbb。这称为“closure”。你对bbb[0] = 5所做的等同于bbb.__setitem__(0, 5),所以你改变了bbb的一个元素,但没有改变bbb本身。

    最后要注意的是,有一个 nonlocalglobal 关键字可以改变行为(但它们应该在特殊情况下使用,只有在有适当的辨别力并且只有在合理的情况下才能使用它们)。

    aaa = 100
    def plus():
        global aaa
        aaa = 8
    
    plus()
    print(f"aaa = {aaa}")   # aaa = 8
    

    【讨论】:

      【解决方案2】:

      aaa = []捆绑到名称,默认情况下,它创建一个局部变量。

      bbb[0] = 5变异的绑定到 bbb 的对象本身没有绑定 bbb;由于 bbb 从未在函数内分配/绑定,因此它仍然是一个非局部变量(解析为全局 bbb)。

      如果你想让aaa = []修改全局aaa而不是创建一个新的局部函数,该函数必须包含一个global声明它是全局的:

      def plus():
          global aaa
          aaa = 8   #aaa=8
      

      如果您希望 bbb[0] = 5 不修改全局,则需要将全局(更改为不同的名称;在函数中访问全局和同名局部是丑陋的)到局部,例如:

      def plus2():
          bb = bbb[:]  # Shallow copy slice to new local
          bb[0] = 5    # Doesn't change bbb
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-04
        • 2019-01-20
        • 1970-01-01
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多