【问题标题】:scopes of list or arrays in python when renewed更新时python中列表或数组的范围
【发布时间】:2021-07-14 13:41:26
【问题描述】:

在这段代码中,我发现当第 1 行正在运行时(第 2 行被注释),tcheck2 函数可以更改列表 x,但是当它在第 2 行更新 x=[[] for _ in range(3+1)] #2 时,tcheck1 函数中的 x 没有任何反应,为什么是吗?

def tcheck():
    x=[11,54]
    tcheck2(x)
    print(x)
def tcheck2(x):    
    print(x)
    x[0]+=1 #1
    x=[[] for _ in range(3+1)] #2
    

【问题讨论】:

  • 你能澄清一下这个问题吗? q 是什么?
  • @S3DEV 抱歉,这是打印。
  • This video might be of interest @NedBatchelder 谈论变量赋值期间发生的事情,特别是列表可变性。 (事实上​​,我发现自己不时会重新观看提醒!)
  • 因为x=[[] for _ in range(3+1)] 创建了一个新列表,并将其分配给局部变量x。另一方面,x[0]+=1 实际上是列表对象的 mutator 方法。

标签: python arrays list scope


【解决方案1】:

来自您的代码:

def tcheck():
    x=[11,54]
    tcheck2(x)
    q(x)
def tcheck2(x):    
    q(x)
    x[0]+=1 #1
    x=[[] for _ in range(3+1)] #2
    # t+=3
    q(t)

#1 行只是增加了x 的一个元素。但是 #2 将局部变量 x 替换为全新的 list

也许你的意思是:x[:] = [[] for _ in range(3+1)] #2,它将更新x 所指的list 的全部内容。

【讨论】:

  • 我知道,但那是什么规则,不是列表或数组应该指向它的引用吗?
  • 强制链接到Ned Batchelder
  • @FarhangAmaji 这里没有特殊规则。 所有对象都以这种方式工作,列表在任何方式中都不是特殊的。 Python 中的一切都是对象,有些对象公开了 mutator 方法,有些则没有(它们是“不可变的”)。赋值的语义总是完全相同的
  • 顺便说一句,变量也是对象吗?他们不遵循数组的规则,也不像你所说的任何基于对象的东西。
  • @FarhangAmaji 变量不是对象,变量是引用对象的名称。说“他们不遵循数组规则”是没有意义的,这是什么意思? 列表没有特殊规则您总是使用变量作为引用对象的方式。
猜你喜欢
  • 2018-04-09
  • 2017-12-13
  • 1970-01-01
  • 2022-08-14
  • 2023-03-16
  • 1970-01-01
  • 2018-08-18
  • 2016-10-05
  • 1970-01-01
相关资源
最近更新 更多