【问题标题】:How do I change a variable inside a variable?如何更改变量内的变量?
【发布时间】:2017-12-18 15:43:52
【问题描述】:

这是我的代码:

hp1 = 100
health1 = 'you have', hp1

hp1 = hp1 - 50
health1

print hp1
print health1

这是打印出来的:

50
('you have', 100)

为什么生命值里面的hp1没有变化?

【问题讨论】:

  • 你为什么希望它改变?
  • 因为我从 hp1 中减去了 50。我是 python 新手,所以我真的不知道我在做什么哈哈
  • 您在将hp1 分配给health1 时对其进行了评估。之后他们就没有联系了。你没有考虑清楚。假设您改为使用5 + hp1**2/(1 - hp1)。你还会期望价值被追踪吗?您是否认为您正在创建一个闭包,并且每次引用 health1 时都会重新评估表达式?显然不是。
  • @StefanPochmann 是的,health[1] is hp1 确实是 True。但这不是我的意思。我的意思是改变其中一个对另一个没有影响。

标签: python


【解决方案1】:

要使用hp1 的任何突变自动更改输出,您可以使用一个类:

class Health:
   def __init__(self, health):
       self.health = health
   def __add__(self, val):
       return Health(self.health + val)
   def __sub__(self, val):
       return Health(self.health - val)
   def __repr__(self):
       return "you have {}".format(self.health)

hp1 = Health(100)
hp1 -= 50
print(hp1)

输出:

you have 50

【讨论】:

  • 这是第一个解决问题意图的答案,而不仅仅是解释观察到的结果。
  • @chepner 好吧,公平地说,OP 明确询问 “为什么 hp1 在健康状况内没有变化?”,而不是 “如何。 ..?”
  • 公平地说,在你的例子中,你可以做到a = 0 ; a += 50 ; print a。我相信你应该把我回答的内容写在 OP 的范围内。
  • 呃……这是什么?这样做不会做想要的事情。
【解决方案2】:

下面一行:

health1 = 'you have', hp1

正在创建具有两个值的tuple"you have"100(请注意,hp1 的值是复制,而不是引用)。然后将这个tuple 分配给一个名为health1 的新变量。

health1hp1 无关。如果hp1 被覆盖、删除、丢弃或发生任何事情,health1 不在乎。


如果您非常渴望将此变量作为引用传递,您可以围绕int 类型创建一个包装类:

class IntWrapper(object):
     def __init__(self, value):
          self.value = value
     def __add__(self, value):
          return IntWrapper(self.value + value)
     def __iadd__(self, value):
          self.value += value
          return self
     def __sub__(self, value):
          return IntWrapper(self.value - value)
     def __isub__(self, value):
          self.value -= value
          return self
     def __str__(self):
          return str(self.value)
     def __repr__(self):
          return str(self)

hp1 = IntWrapper(100)
health1 = 'you have', hp1

hp1 -= 50

print hp1          # 50
print health1      # ('you have', 50)

【讨论】:

  • 如果“值是复制的,不是引用的”,那为什么health1[1] is hp1是真的?
  • 术语挑剔:Python 中没有原始类型。 int 对象是完整的对象,就像任何其他对象一样。
  • @StefanPochmann 我同意。但是,如果它不更改内部值,那么它将无法完成 OP 想要的操作,因为 hp1 将指向一个新的引用,而 health1 将指向一个陈旧的引用。
  • @MatiasCicero 是的,但你最好不要对__sub__ 这样做。改为使用__isub__。或者使用decrease 左右可能会更好,将其称为hp1.decrease(50) 而不使用赋值符号。
【解决方案3】:

要做你想做的事,你必须使用一个。这是您将在 python 中遇到的最接近的指针形式。

这是一个例子:

class Health():
    def __init__(self, value):
        self.hp = value

    def __repr__(self):
        return 'You have {}.'.format(self.hp)

health = Health(100)
hp_clone = health
health.hp -= 50

print hp_clone
# Program outputs : You have 50.

您的问题也可能与 Pointers in Python?.

其他人已经解释了你程序中发生的事情。

【讨论】:

    【解决方案4】:

    因为您定义了 health1 - 一个 (string, int) 元组 - 因为 hp1 仍然是 100,并且从那时起就没有更改它。这不是 C/C++ 意义上的指针,只是按值复制。

    【讨论】:

    • 有什么解决办法?
    • 解决方案是什么?如果要更改变量,请更改它。否则不要更改它们。我看不出有什么问题。通过教程来了解这些事情是如何工作的:docs.python.org/3/tutorial
    • 没有按值复制。 Python 中的赋值从不复制
    【解决方案5】:

    在你的代码中你已经这样做了,

    hp1 = 100 # setting hp1 as 100
    health1 = 'you have', hp1 # making a tuple 
    
    hp1 = hp1 - 50 # subracting 50 from hp1 -> gives 50 as result
    health1 # simply calling health1
    
    print hp1 # displaying hp1
    print health1 # displaying health1
    

    在这段代码中,

    你将hp1定义为100,让它存储在1000的位置

    您创建了一个元组名称health1'you have', hp1。它将存储在2000

    这样的位置

    您从 hp1 中减去 50,得到 hp1 50,这不会改变 health1 变量,因为它存储在不同的位置。但它会改变hp1的值

    希望这会有所帮助。!!

    【讨论】:

      猜你喜欢
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2016-01-01
      • 2019-12-03
      • 1970-01-01
      • 2022-12-05
      相关资源
      最近更新 更多