【问题标题】:How to update a list of variables in python?如何更新python中的变量列表?
【发布时间】:2016-12-30 15:37:29
【问题描述】:

这是我在使用 python 编程时遇到的一个严重问题。用户可以将各种变量附加到列表中,但是,稍后访问此列表时仍将显示与首次分配时相同的结果。例如下面

a=1
b=2
list = [a,b] #user defined order
print list # 1,2
a=2
print list # prints 1,2

我需要打印出 2,2 的列表。但是我找不到动态更新列表以适应任何变量顺序的方法(许多方法是硬编码,我在网上看到过,例如在需要更新时分配 list = [a,b] 但是我不知道是否它的 b,a 或 a,b)

我们将不胜感激。谢谢

编辑:我的问题有所不同,因为变量需要在列表中动态更新,而不是简单地更改列表项。

【问题讨论】:

标签: python list variables


【解决方案1】:

您需要更新列表而不是变量:

a = 1
b = 2
lst = [a, b]  # the list now stores the references a and b point to
              # changing a later on has no effect on this!  
lst[0] = 2

请不要使用list 作为变量名!这是 python 中的 keyword 内置类型,覆盖它是一个非常糟糕的主意!

如果您只知道列表中元素的值(并且该值是唯一的),您可以这样做:

old_val = 2
new_val = 3

lst[lst.index(old_val)] = new_val

【讨论】:

  • 这是我的问题,我不能简单地声明 lst = [a,b] 因为订单是未知的,所以我想,我不能这样做:(
  • 那么您的问题与您在问题中提出的问题不同:您将a 放在列表的第一位,然后想要更改a(列表中的第一个元素) .那么的问题是什么?
  • 抱歉给您带来了困惑。 a 可以是列表的第 n 个元素,并且可以按任何顺序定义列表,例如 [a,b...],[b,a....] 等。所以我的问题是如何更改是在一个列表中,然后让它反映这一点?感谢您迄今为止的帮助
  • 你好@hiroprotagonist,如果列表是熊猫数据框列表并且我想更改数据框的实际值,我将如何更改这个等式?我不希望值只在列表(lst)中改变,但数据框中的实际值也会改变?有什么想法吗?
  • @rishijain 抱歉,有点难以理解你真正想要的东西。你为什么不把它变成一个真正的问题,让比我更熟练的人可以回答!祝你好运!
【解决方案2】:

如果将不可变项存储在列表中是不可能的,Python 整数就是这样,所以添加一个间接级别并使用可变列表:

a,b,c,d = [1],[2],[3],[4]
L = [d,b,a,c] # user-defined order
print L
a[0] = 5
print L

输出:

[[4], [2], [1], [3]]
[[4], [2], [5], [3]]

不过,这有一种X-Y Problem 的感觉。描述您使用此解决方案解决的问题可能会得出更好的解决方案。

【讨论】:

  • 遗憾的是,这有点像 XY 问题,但是我发现了另一个我确实需要这个的情况,所以你的努力没有白费! :)
【解决方案3】:

你为什么不用字典??

带字典:

_dict = {}
_dict["a"] = 1
_dict["b"] = 2
print _dict["a"] # prints 1

现在如果你想设置和获取变量“a”的值:

_dict["a"] = 2
print _dict["a"] # prints 2

【讨论】:

    【解决方案4】:

    在赋值“a=1”时,会创建一个值为 1 的整数对象。该对象将添加到您的列表中。在第二次赋值 (a=2) 时,创建了一个 new 对象,但旧的对象仍在列表中,其值不变。这就是你所看到的。

    要改变这种行为,必须改变对象的值。 Ints 在 Python 中是不可变的,这意味着不可能完全做到这一点,即更改值。您必须定义自己的值,然后更改其值。例如:

    class MyInt(object):
    
        def __init__(self, value):
            self.setValue(value)
    
        def setValue(self, value):
            self.value = value
    
        def __repr__(self):
            return str(self.value)
    
    a=MyInt(1)
    print(dir(a))
    b=2
    list = [a,b] #user defined order
    print (list) # 1,2
    a.setValue(2)
    print (list) # prints 2,2
    

    【讨论】:

    • 当然,这意味着如果不编写一大堆其他代码,就无法对对象进行数学运算。
    • OP 在任何地方都没有提到做数学。您的评论虽然属实,但因此无关紧要。不要投票给我。
    • 当有人用数字填写列表时,他们几乎肯定会想以某种方式操纵这些数字。使用您的解决方案,您甚至无法将列表项与其他数字进行比较以查看它们是否相等!我不认为这是一个非常有用的方法。
    • 它回答的是问题而不是猜想。
    【解决方案5】:

    它不干净,而是一个变通的技巧,您可以将 a 的值分配为单个元素列表

    a = [1]
    b = 2
    

    因此,当您将它们分配给列表时:

    lst = [a,b]
    

    并通过调用其第 0 个元素来更改 a 的值:

    a[0] = 2
    

    它也会改变被引用的列表

    print(lst)
    #[[2],2]
    

    同样,如果您将值放在列表中:

    lst[0][0] = 2
    print(a[0])
    #2
    

    【讨论】:

      猜你喜欢
      • 2018-07-04
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多