Javascript python运行时模型不是字典中的字典吗?
经历了这一切之后Javascript python运行时模型不是字典中的字典吗?,javascript,python,dictionary,Javascript,Python,Dictionary,经历了这一切之后 globals() 其中操作符是一个新的str类型键,值是模块类型对象 在当前名称空间中进一步使用操作符模块(例如\uuuu abs\uuuu) >>> globals()['operator']['__abs__'] Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> globals()['operator']['__ab
globals()
其中操作符
是一个新的str
类型键,值是模块
类型对象
在当前名称空间中进一步使用操作符
模块(例如\uuuu abs\uuuu
)
>>> globals()['operator']['__abs__']
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
globals()['operator']['__abs__']
TypeError: 'module' object has no attribute '__getitem__'
>>>
在python中,为什么全局名称空间成员(键)只被视为字典成员,而不是它们的值(比如操作符对象)?在Python中,使用点访问对象属性的语法与使用方括号访问对象项的语法之间存在差异
您可以通过使用特殊方法(以及用于设置的相关方法等)和(以及相关方法)在自定义类型中使用此差异。因此,您可以实现您的类型来支持两种语法,以实现相同的效果;或者,您可以使用它为每个语法分配不同的语义,就像标准Python类型一样
至于为什么会有这种区别,这只是一个语言设计的决定,最终使语言更强大。例如,这允许字典有一个键'update'
,同时还有一个属性——在本例中称为的方法
另外,不依赖于foo.bar
和foo['bar']
的等价性可以避免将订阅键限制为字符串,就像JavaScript一样。相反,我们可以使用任何可哈希对象作为密钥。这使得类似于JavaScripts的dict
类型更新,它还支持多种键类型。请注意,由于JavaScript的语法选择较差,因此存在explit方法和访问映射项的方法。在Python中,使用点访问对象属性的语法与使用方括号访问对象项的语法之间存在差异
您可以通过使用特殊方法(以及用于设置的相关方法等)和(以及相关方法)在自定义类型中使用此差异。因此,您可以实现您的类型来支持两种语法,以实现相同的效果;或者,您可以使用它为每个语法分配不同的语义,就像标准Python类型一样
至于为什么会有这种区别,这只是一个语言设计的决定,最终使语言更强大。例如,这允许字典有一个键'update'
,同时还有一个属性——在本例中称为的方法
另外,不依赖于foo.bar
和foo['bar']
的等价性可以避免将订阅键限制为字符串,就像JavaScript一样。相反,我们可以使用任何可哈希对象作为密钥。这使得类似于JavaScripts的dict
类型更新,它还支持多种键类型。请注意,由于JavaScript的语法选择较差,因此存在explit方法和访问映射项的方法。1。
JS没有字典。它们通过使用对象进行仿真。
在定义字典或关联数组时,或者在javascript中以任何方式调用它时,您所做的是
将值指定给新对象的属性
二,。
Python有实际的数据类型字典,即dict(),它是一个对象(Python中的所有内容)专门用于存储对key:value,并针对快速访问进行了优化。
这实际上是一个包含Python作用域的容器。即当你打电话时
globals()
您无法查看全局变量。您确实得到了一个指向实际全局范围的指针。
所以,如果你说:
globals()["abcdefgh"] = 123456
你将能够
print abcdefgh
因为您直接将变量abcdefgh插入到解释器全局命名空间持有者中。
当您自动使用=赋值运算符时,会发生这种情况
因此,globals()字典包含真实值,它们是对象,但不一定是字典
在JS中,您所描述的是有效的,因为您实际上在Python中所做的是:
class obj: pass
somevar = obj()
somevar.one = 1
somevar.two = "two"
somevar.something = "nothing"
如果要将它们视为dict,则必须访问somevar实例的命名空间字典:
print somevar.__dict__
somevar.__dict__["blah"] = "xxx"
print somevar.__dict__
print dir(somevar) # To see all attributes of obj()
否则就是:
print somevar
<__main__.obj instance at 0xxxxxxxxx>
打印somevar
如果希望obj()实例充当dict(),则必须为其实现字典接口
在JS中,它始终只是另一个对象,所以不管它最初是如何定义的,语法都会继续工作。1。
JS没有字典。它们通过使用对象进行仿真。
在定义字典或关联数组时,或者在javascript中以任何方式调用它时,您所做的是
将值指定给新对象的属性
二,。
Python有实际的数据类型字典,即dict(),它是一个对象(Python中的所有内容)专门用于存储对key:value,并针对快速访问进行了优化。
这实际上是一个包含Python作用域的容器。即当你打电话时
globals()
您无法查看全局变量。您确实得到了一个指向实际全局范围的指针。
所以,如果你说:
globals()["abcdefgh"] = 123456
你将能够
print abcdefgh
因为您直接将变量abcdefgh插入到解释器全局命名空间持有者中。
当您自动使用=赋值运算符时,会发生这种情况
因此,globals()字典包含真实值,它们是对象,但不一定是字典
在JS中,您所描述的是有效的,因为您实际上在Python中所做的是:
class obj: pass
somevar = obj()
somevar.one = 1
somevar.two = "two"
somevar.something = "nothing"
如果要将它们视为dict,则必须访问somevar实例的命名空间字典:
print somevar.__dict__
somevar.__dict__["blah"] = "xxx"
print somevar.__dict__
print dir(somevar) # To see all attributes of obj()
否则就是:
print somevar
<__main__.obj instance at 0xxxxxxxxx>
打印somevar
如果希望obj()实例充当dict(),则必须为其实现字典接口
在JS中,它总是另一个对象,所以不管它是如何定义的,语法都会继续工作