【问题标题】:Can I link two variables such that one is double of another in python?我可以链接两个变量,使得一个在 python 中是另一个的两倍吗?
【发布时间】:2022-01-20 02:24:12
【问题描述】:

所以基本上我有两个列表 ab 并像 a=b=[10] 一样定义它们,所以改变一个会改变另一个 -

a=b=[10]
a[0]+=1
a
>>>[11]
b
>>>[11]

有没有办法做到这一点,而是让它给变量的两倍?期望的输出 -

a=b=[10]
#some code
a
>>>[10]
b
>>>[20]

【问题讨论】:

  • 什么是内存值
  • 喜欢变量的id
  • id(a) 将返回与id(b) 相同的值
  • 您可以使用实例属性来执行此操作(使 instance.b 成为属性,从 instance.a 计算值),但不能使用普通变量。
  • 问题是,一旦你这样做了,你就不能改变像 - class foo: def __init__(self,a): self.a=a self.b=a*2 这样的值,然后如果你称之为c=foo(2) 然后做c.a=3 然后c.b 不会改变为6跨度>

标签: python list memory mutability


【解决方案1】:

您可以创建一个继承自list 的新类,并创建一个返回修改后的值的property

class new_list(list):
    @property
    def double(self):
        return [i * 2 for i in self]

        
a = new_list([10])

a.append(20)
a.append(30)
print(a, a.double)
[10, 20, 30] [20, 40, 60]

这种方法的优点是您仍然可以直接使用来自list 的所有方法。

【讨论】:

    【解决方案2】:

    我不确定我是否能正确理解您正在尝试做的事情,但这样的事情应该可以工作。

    prop = property(lambda self: self.a * 2)
    # Dynamically creating a class with a default value for `a` and `b`
    Class = type('ClassName', (object,), {"a": 0, "b": prop})
    
    c = Class()
    c.a = [10]
    print(c.a, c.b)  # ([10], [10, 10])
    

    【讨论】:

    • 谢谢!这不是我想要的,但它解决了我的问题。
    【解决方案3】:

    使用 a=b=[0] 您实际上并没有两个列表。分配只是复制对列表的引用,而不是实际的列表,因此 liat 'a' 和列表 'b' 在分配后都引用同一个列表。

    a=b=[10]
    print(a) // [10]
    b = list(a)[0] * 2 
    a[0] += 1
    
    print(a) // [11]
    print(b) // [20]
    

    要实际将 a 复制到 b 中,您有多种选择,最简单的一种是使用内置的 list() 函数进行实际复制。 谢谢。

    【讨论】:

    • 我不想这样,我想让它当我修改一个变量时,另一个变量也被修改
    • 好的,我想你需要一个事件系统。想法是监听列表“a”中的值更改事件,然后触发一个修改列表“b”的方法
    • 这可能会有所帮助stackoverflow.com/questions/2612802/…
    【解决方案4】:

    因为a=b=[10] 等于b=[10];a=b,所以它们是相同的,只有一个实例。 你可以

    b=[a[0]*2] 
    

    b=[x*2 for x in a]
    

    【讨论】:

      猜你喜欢
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多