如何在Python中为变量创建别名?

AIB*_*AIB 9 python variables alias

正常的方式

class A:
    __init__():
     self.a.b.c = 10

    anotherMethod():
      self.a.b.c = self.a.b.c * 10
Run Code Online (Sandbox Code Playgroud)

别名的做法

class A:
    __init__():
     self.a.b.c = 10         
     alias self.aliased = self.a.b.c # Creates an alias 

    anotherMethod():
      self.aliased = self.aliased * 10 # Updates value of self.a.b.c
Run Code Online (Sandbox Code Playgroud)

如何在Python中实现别名?我想要做的是减少由于长变量名称引起的混乱.这是一个多线程环境.所以简单地复制到局部变量是行不通的.

Gar*_*tty 23

对此的解决方案是使用getter和setter方法-幸好Python有property()内置隐藏的这种丑陋.

class A:
    def __init__():
     self.a.b.c = 10

    @property
    def aliased(self):
        return self.a.b.c

    @aliased.setter
    def aliased(self, value):
         self.a.b.c = value

    def anotherMethod():
      self.aliased *= 10 # Updates value of self.a.b.c
Run Code Online (Sandbox Code Playgroud)

正如其他人所指出的那样,通常这是设计糟糕的标志 - 您通常不希望类必须知道有三种关系的对象 - 这意味着对给定项目的更改可能会导致整个代码库出现问题.尝试让每个类处理它周围的类是一个更好的主意,而不是更进一步.


nos*_*klo 8

你很困惑.Python不会复制任何隐含的内容,它只存储引用,因此无论您处于哪种环境,它都可以工作.

# this creates a list and stores a *reference* to it:
really_really_long_variable_name = [] 
# this creates another new reference to the *same list*. There's no copy.
alias = really_really_long_variable_name

alias.append('AIB')
print really_really_long_variable_name
Run Code Online (Sandbox Code Playgroud)

你会得到 ['AIB']

  • 问题是`alias = ['BIB']`不会更新`really_really_long_variable_name` (7认同)
  • 对于那些从字面上读到“Python 不会隐式复制任何内容”的人的警告:`a = 1; b = a; 一 = 2; print(b)` 是 `1` 并且 `a = 1; b = a; b = 2; 打印(a)`是`1`。重新分配给一个变量不会更新另一个变量。 (2认同)