[英]Python: are keys in dictionary also treated as variables?
我刚刚刚开始学习python编程。 我想知道:字典中的键是否也被视为变量?
students = {"Jake": 12, "Rachel":12, "Ross":15}
该代码包含学生姓名及其年龄。 例如:“ Jake”是包含值12的变量吗? 还是将其视为变量?
虽然可以使用命名值(或您可能认为的“变量”)构造字典:
>>> x=22
>>> di={x:x}
>>> di
{22: 22}
您还可以证明命名值的值(如果该值是不可变的)在构造时使用,并且不是动态的:
>>> x=5
>>> di
{22: 22}
字典的键必须是可散列的(即不变;不变),这将阻止使用可能会更改的列表,集合或其他命名值:
>>> changeable_list=[22]
>>> di={changeable_list:changeable_list}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
但是dict的价值可以是动态且可变的:
>>> di={tuple(changeable_list):changeable_list}
>>> di
{(22,): [22]}
该列表可以修改:
>>> changeable_list.append(44)
>>> changeable_list
[22, 44]
>>> di
{(22,): [22, 44]}
注意dict的值如何随着列表的变化而变化,因为它们是同一对象。
如前所述,不,字典的键不是变量。 但是,有时可以将变量键认为是键:
students = {"Jake": 12, "Rachel":12, "Ross":15}
class Students:
pass
s = Students()
s.Jake = 12
print(s.Jake, students['Jake'])
print(getattr(s, 'Jake'))
输出:
12 12
12
我所知道的语法没有一种可以让您以这种形式从students
访问值12
: students.Jake
但是,修改上面的代码:
class Students:
def __getitem__(self, key):
return getattr(self, key)
... # as before
print(getattr(s, 'Jake'), s['Jake'])
输出:
12 12
现在,学生有了一个类似于字典的操作符[](可能还需要其他操作符。)
因此,对象可以变得像字典一样,因为它们具有基础字典来使它们作为对象工作。
TL; DR-它取决于“变量”的含义。 dict的行为类似于python命名空间,但允许更多类型的变量名。
Python对象没有固有名称。 它们可以被一个或多个其他对象引用,并且当它们的引用计数变为零时,它们将被删除。 当您将对象分配给变量时,某些数据结构会对该对象添加一个引用,并将该对象与名称相关联。 该数据结构是变量的名称空间(即变量名有效的上下文)。 对于大多数对象而言,该数据结构是一个dict
。
让我们看两个例子:
class Students:
pass
student_obj = Students()
和
student_dct = {}
我可以把杰克当作一个变量
>>> student_obj.Jake = 12
>>> student_obj.Jake
12
>>> student_obj.__dict__
{'Jake': 12}
或将其添加到字典
>>> student_dct["Jake"] = 12
>>> student_dct["Jake"]
12
>>> student_dct
{'Jake': 12}
那真的很接近第一个例子! 变量的优点是它是由python解析的,而python会为您查找。 Python将student_obj.Jake
转换为student_obj.__getattribute__("Jake")
。 对于普通的类对象,python将检查对象__dict__
的名称,然后回退到包含名称空间的名称。 使用__slots__
或在C中实现的类遵循不同的规则。
但是,如果您要使用不符合python语法规则的名称,则变量分配是不利的。
>>> student_obj.Jim Bob = 12
File "<stdin>", line 1
student_obj.Jim Bob = 12
^
SyntaxError: invalid syntax
在这里,您希望“ Jim Bob”是一个变量,但由于它破坏了python,因此不能直接用作变量。 因此,您将其放入字典中
>>> student_dct["Jim Bob"] = 12
因此,字典项是“变量”(可以引用并重新分配值),但不是“ python变量”,因为python不会为您实现查找。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.