【问题标题】:Why is a variable not updating after changing its dependent variable? [duplicate]为什么变量在更改其因变量后不更新? [复制]
【发布时间】:2020-05-27 12:15:20
【问题描述】:

我不明白为什么当我更改 x 时变量“y”没有更新? ('y' 变量依赖于'x' 对吗?)

x = 5
y = x*2

print(x)
print(y)

x = 3

# Expect it to print '3' and '6' instead it print '3' and '10'
print(x)
print(y)

【问题讨论】:

  • 'y' 变量依赖于 'x' 对吗? 不,y 是基于 x 值创建的,但之后它们只是朋友。
  • intfloatstring 这样的不可变对象是按值而不是按引用保存的。所以,当你改变x时,不同的可变对象的值
  • 在您的第一个声明中,您可以将其视为简单的y = 5*2 而不是y=x*2。在最初的声明之后,它们彼此无关。

标签: python variables debugging


【解决方案1】:

('y' 变量依赖于'x' 对吗?

没有。

很少有编程语言具有依赖/计算的变量[0],而Python不是其中之一[1]。执行y = x*2 时,= 右侧的表达式被完全计算,结果集为y 的值。 y 此后独立于 x[2]。

一般来说,如果您希望y 成为x 的函数...您将其定义为x 的函数:

x = 5
def y(): return x*2

print(x)
print(y())

x = 3

# Expect it to print '3' and '6' instead it print '3' and '10'
print(x)
print(y())

[0] 我知道make 的惰性变量和 Perl 的绑定标量

[1] 它确实有计算出 attributes(又名属性),但这是完全不同的事情

[2] 有些情况看起来像因变量,例如如果您将y 设置为x 的可变子结构,则x 的此子部分的更改将通过y 可见。但这实际上并不是依赖关系,只是这两个变量指向相同的(可变)结构,因此两者都“看到”了应用于该共享结构的突变。

【讨论】:

  • 只是为了详细说明脚注 [2]。这方面的一个示例是当您有一个诸如x = [1, 2, 3] 之类的列表时。设置y = x 会导致两个变量指向同一个可变结构。因此,如果您执行 x[0] = 10 后跟 print(y[0]) 之类的操作,您将得到 10,而不是 1。
【解决方案2】:

y 变量依赖于x 对吧?

嗯,首先,如果你设置:

a = 7
b = a
a = 4

那么,

print(id(a))print(id(b)),你会得到两个不同的id,因此b 不会在你覆盖a 时改变。

【讨论】:

    【解决方案3】:

    您的 y 指向旧版本的 x 变量。 要更新 y,您可以这样做:

    x = 5
    y = x * 2
    
    print(x)
    print(y)
    
    x = 3
    y = x * 2
    
    print(x)
    print(y)
    

    将输出:

    5
    10
    3
    6
    

    【讨论】:

      【解决方案4】:

      因为在您为变量y 赋值后,为了更改它,您需要直接访问yy= x*2 是根据这行代码中x 的值给y 赋值。这就是 python 的工作原理,还有其他代码语言可以像你预期的那样执行。 将新值分配给 x 后,您需要再次写入 y=x*2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        • 2017-02-10
        • 2017-10-06
        • 2020-02-04
        • 2019-08-19
        • 1970-01-01
        相关资源
        最近更新 更多