【问题标题】:How can I evaluate variable to another variable before assigning? [closed]在分配之前如何将变量评估为另一个变量? [关闭]
【发布时间】:2011-01-04 03:30:37
【问题描述】:

这个问题分成子问题

  • 一个回复建议看的Python指针,更多here
  • “为什么不修改本地人?” -问题here.

原始问题

#!/usr/bin/python
#
# Description: trying to evaluate array -value to variable before assignment
# but it overwrites the variable
#
# How can I evaluate before assigning on the line 16?

#Initialization, dummy code?
x=0
y=0

variables = [x, y]
data = ['2,3,4', '5,5,6']

# variables[0] should be evaluted to `x` here, i.e. x = data[0], how?
variables[0] = data[0]

if ( variables[0] != x ):
 print("It does not work, why?");
else:
 print("It works!");

目标:修复实验室报告上的硬编码作业,在我可以更有效地使用列表理解之前,我需要解决作业问题 - 还是我做错了什么?

#!/usr/bin/python
#
# Description: My goal is to get the assignments on the line 24 not-hard-coded

variables = [y, x, xE]
files = [measurable, time, timeErr]

# PROBLEM 1: Assignment problem
#
#Trying to do:
#
# var[1] = files[1] so that  if (y == measurable): print("it works")
# var[2] = files[2] so that  if (x == time): print("it works")


#GOAL TO GET ASSIGNMENT LIKE, data is in files "y, x, xE":
# 
# y = [3840,1840,1150,580,450,380,330,340,340,2723]
# x = [400.0,204.1,100.0,44.4,25.0,16.0,11.1,8.2,7.3,277.0]
# xE = [40, 25, 20, 20, 20, 20, 20, 20, 20, 35]


#Trying to do this
# 
# y = open('./y').read();
# x = open('./x').read();
# xE= open('./xE').read();
# 
# like this? f evaluated each time?
for f in files:
 f = open('./'+f).read()

【问题讨论】:

  • 目前还不清楚您要在这里寻找什么。 variables[0] = data[0] 表示现在 variables == ['2,3,4', 0];或变量 [0] = '2,3,4'。您将 x 分配给 0...他们现在怎么可能相等?
  • 您在这里的真正目标是什么?您尝试做的事情是困难且笨拙且编码不好。几乎可以肯定,有更好的方法来实现你的真正目标。
  • 你的 if 结构不是正确的 Python 语法。
  • John Kugelman:很抱歉造成混乱,您现在可以看到一般问题。我基本上有很多从变量到文件的双射关系,我想批量初始化分配它们。你会怎么做?

标签: python variable-assignment


【解决方案1】:

我会使用带有一点间接性的字典。当你想使用动态变量名时,这暗示你不应该使用实际变量,而是使用某种数据结构,如列表或字典。

尝试使用两种数据结构:一个名为variables 的列表存储变量的名称,一个名为values 的字典存储它们的

variables = ['y', 'x', 'xE']
values = dict((name, None) for name in variables)
files = [measurable, time, timeErr]

# PROBLEM 1: Assignment problem
#
# Trying to do:
#
# var[1] = files[1] so that  if (y == measurable): print("it works")
# var[2] = files[2] so that  if (x == time): print("it works")

values[variables[1]] = files[1]
values[variables[2]] = files[2]

if values['y'] == measurable:
    print("it works")


# GOAL TO GET ASSIGNMENT LIKE, data is in files "y, x, xE":

for name in variables:
    variables[name] = open('./'+name).read()

【讨论】:

    【解决方案2】:

    看来您只是想多了这个问题。想想你想要的实际结果。这段代码很混乱,我什至不确定你要解决的实际问题是什么。我看到了两种可能性之一(这似乎是合理的——有无数种不合理的可能性):

    1. 您想分配 x = '2,3,4' 和 y = '5,5,6',但在初始化 x 和 y 时没有这些值。在这种情况下,你会这样做:

      data = []
      ... data is eventually populated ...
      x, y = data
      
    2. 您想要一个带有键 x 和 y 的字典以及数据中的相应值,在这种情况下您会这样做:

      klist = ['x', 'y']
      data = ['2,3,4', '5,5,6']
      mydict = dict(zip(klist, data))
      # mydict['x'] == '2,3,4'
      

    【讨论】:

    • 接受,因为最后一部分,很干净。
    【解决方案3】:

    您对引用的工作原理有了基本的了解,但您会感到困惑。当您调用语句 variables[0] = data[0] 而不是重新分配 x 指向的内容时,您重新分配 variables[0] 指向的内容。这就是为什么“它不起作用”。

    这里:

    x = 0
    y = x
    y = 4
    

    这是您尝试做的事情的核心。如果你在 REPL 中输入这个,你会看到 x 仍然等于 0,而不是 4。

    【讨论】:

      【解决方案4】:

      您对引用的混淆指针。

      1. x=0
      2. variables = [x, y] 这无关紧要,因为它会被重新分配
      3. variables[0] = data[0] 所以变量[0] == ['2,3,4]

      在 3 处,您认为您有对 x 的引用。但你没有!你只有对 variables[0] 的引用

      也许你的想法是这样的:

      x = [1]
      var = [x]
      var[0][0] = 2
      print var, x
      >>> [[2]] [2]
      

      这实际上会改变 x 的值。列表和字典会改变(如mutatable),而字符串和数字不会。没有办法获得对它们的引用来更改基础值。

      【讨论】:

        【解决方案5】:

        ...啊,我想我得到了你想要的。有 99% 的可能性这不是一个好主意,但我会给你代码来做我认为你要求的事情:

        首先你需要改变这一行:

        variables = ['x','y']
        

        (因为你想要的是变量名,而不是值)

        现在为了分配变量x,一种方法是:

        locals()[variables[0]] = data[0]
        

        【讨论】:

        【解决方案6】:

        你的问题是在你初始化变量时,variables[0] 变成了 0,即 x 的值。然后你用一个新值覆盖那个值。

        以下代码输出 0,而不是 1。

        #!/usr/bin/python
        #
        # Description: trying to evaluate array -value to variable before assignment
        # but it overwrites the variable
        #
        # How can I evaluate before assigning on the line 16?
        
        #Initialization, dummy code?
        x=0
        y=0
        
        variables = [x, y]
        data = ['2,3,4', '5,5,6']
        
        x = 1    
        
        variables[0] = data[0]
        
        print(variables[0]);
        

        您可以通过将 x 包装在一个数组中并取消引用来获得所需的结果。

        #!/usr/bin/python
        #
        # Description: trying to evaluate array -value to variable before assignment
        # but it overwrites the variable
        #
        # How can I evaluate before assigning on the line 16?
        
        #Initialization, dummy code?
        x=[0]
        y=[0]
        
        variables = [x, y]
        data = ['2,3,4', '5,5,6']
        
        # variables[0] should be evaluted to `x` here, i.e. x = data[0], how?
        variables[0][0] = data[0]
        
        if ( variables[0][0] != x[0] ):
            print("It does not work, why?");
        else:
            print("It works!");
        

        【讨论】:

          【解决方案7】:

          [部分解决方案]

          我认为Gerrat 正确使用了locals,限制here,因为实验室报告中的某些数据永远不会改变。

          #!/usr/bin/python
          #
          # Description: smelling overuse, probably a roundabout of other problem, rethinking...
          
          variables = ['x','y']
          datas = ['1,2,3,4', '4,44,8,3']
          
          for var, data in zip(variables, datas):
                  locals()[var] = data
          
          #Testing
          print(x +" should be '1,2,3,4'");
          print(y +" should be '4,44,8,3'");    
          

          [解决方案]

          jonesy 和 John Kugelman 发现了其他问题,您需要使用动态数据结构,例如字典,下面是一个干净的示例。

          variables = ['y', 'x', 'xE']
          values = dict((name, None) for name in variables)
          
          # GOAL TO GET ASSIGNMENT LIKE, data is in files "y, x, xE":
          
          for name in variables:
              values[name] = open('./'+name).read()
          
          # Testing, prints the contents
          for val in variables:
                  print(values[val]);
          

          [Solution 2] by jonesy,其实是最清晰的代码。

          klist = ['x', 'y']
          data = ['2,3,4', '5,5,6']
          mydict = dict(zip(klist, data))
          # mydict['x'] == '2,3,4'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-05
            • 2022-06-11
            • 2018-03-17
            • 1970-01-01
            相关资源
            最近更新 更多