GVKun编程网logo

Python字典:keys()和values()是否总是相同的顺序?(python key value 字典)

12

在本文中,我们将给您介绍关于Python字典:keys的详细内容,并且为您解答和values的相关问题,此外,我们还将为您提供关于37-python基础-python3-字典的常用方法-keys()-

在本文中,我们将给您介绍关于Python字典:keys的详细内容,并且为您解答和values的相关问题,此外,我们还将为您提供关于37-python基础-python3-字典的常用方法-keys()-values()-items()、Django:使用values()和get_FOO_display()吗?、Enum#values()是否在每次调用时分配内存?、globals(),locals()和vars()之间有什么区别?的知识。

本文目录一览:

Python字典:keys()和values()是否总是相同的顺序?(python key value 字典)

Python字典:keys()和values()是否总是相同的顺序?(python key value 字典)

看起来字典的keys()values()方法返回的列表始终是一对一映射(假设在调用这两种方法之间字典没有改变)。

例如:

>>> d = {''one'':1, ''two'': 2, ''three'': 3}>>> k, v = d.keys(), d.values()>>> for i in range(len(k)):    print d[k[i]] == v[i]TrueTrueTrue

如果你没有在调用keys()和调用之间更改字典values(),那么假设上述for循环将始终显示True是否错误?我找不到任何证明文件。

答案1

小编典典

发现了这一点:

如果items()keys(),values()iteritems(),iterkeys(),和 itervalues()被称为中间没有修改的字典,列表会直接对应。

在2.x文档和3.x文档上。

37-python基础-python3-字典的常用方法-keys()-values()-items()

37-python基础-python3-字典的常用方法-keys()-values()-items()

  • 有 3 个字典方法,它们将返回类似列表的值,分别对应于字典的键、值和键-值对:keys()、values()和 items()。

  • 这些方法返回的值不是真正的列表,它们不能被修改,没有append()方法。
  • 这些数据类型(分别是 dict_keys、dict_values 和 dict_items)可以用于for 循环。

 

1-keys()

分享图片

2-values()

分享图片

3-items()

分享图片

4-把类似列表的返回值传递给 list函数,转为列表。

分享图片

Django:使用values()和get_FOO_display()吗?

Django:使用values()和get_FOO_display()吗?

我正在尝试改进一些现有的代码,这些代码本来需要3分钟来准备一个大的dataTable(然后由Ajax返回)。旧代码在大型querySet上进行迭代,从各种相关对象中收集信息。从我所阅读的内容以及监视SQL日志的角度来看,遍历查询集通常是一个坏主意,因为SQL是针对每一项执行的。相反,我一直在使用值在单个SQL语句中收集信息,然后对其进行迭代。使用这种技术,我将执行时间减少到15秒以下(但我仍然没有完成)。但是,由于我不再使用模型对象,因此无法使用get_FOO_display()。有没有一种方法可以在使用values()时使用此功能?

简化后,原来是:

for user in users:
   data.append(user.get_name_display())  # Appends 'Joe Smith'
return data

新的代码是:

for user in users.values('name'):
   data.append(user['name'])  # Appends 'JSmith001',which is incorrect
return data

另外,如果还有其他方法可以保留模型对象的创建,但在后端只需要一条SQL语句,我很想知道这一点。谢谢!

Enum#values()是否在每次调用时分配内存?

Enum#values()是否在每次调用时分配内存?

我需要int在Java中将序数值转换为枚举值。这很简单:

MyEnumType value = MyEnumType.values()[ordinal];

values()方法是隐式的,我无法找到它的源代码,因此是一个问题。

是否MyEnumType.values()分配新数组?如果可以的话,第一次调用时是否应该缓存该数组?假设将非常频繁地调用转换。

globals(),locals()和vars()之间有什么区别?

globals(),locals()和vars()之间有什么区别?

是什么区别globals(),locals()vars()?他们返回什么?更新结果有用吗?

答案1

小编典典

这些每个都返回一个字典:

  • globals() 总是返回模块名称空间的字典
  • locals()总是返回当前名称空间的字典
  • vars()返回当前名称空间的字典(如果不带参数调用)或参数的字典。

locals并vars可以使用更多解释。如果locals()在函数内部调用,它将使用该时刻的当前局部变量名称空间(加上任何闭包变量)的值来更新字典并返回它。locals()每次对同一堆栈框架的多次调用都会返回相同的字典-它作为其f_locals属性附加到堆栈框架对象。dict的内容在每次locals()调用和每个f_locals属性访问时更新,但仅在此类调用或属性访问时更新。分配变量时,它不会自动更新,并且在dict中分配条目不会分配相应的局部变量:

import inspectdef f():    x = 1    l = locals()    print(l)    locals()    print(l)    x = 2    print(x, l[''x''])    l[''x''] = 3    print(x, l[''x''])    inspect.currentframe().f_locals    print(x, l[''x''])f()

给我们:

{''x'': 1}{''x'': 1, ''l'': {...}}2 12 32 2

第一个print(l)只显示一个’x’条目,因为分配要l在locals()调用之后进行。再次print(l)调用locals()后,第二个显示一个l条目,即使我们没有保存返回值。第三和第四print步表明分配变量不会更新l,反之亦然,但是在我们访问之后f_locals,局部变量会locals()再次复制到其中。

两个注意事项:

此行为是CPython特有的-其他Python可能允许更新使它自动返回到本地名称空间。
在CPython 2.x中,可以通过exec “pass”在函数中放置一行来使其工作。这会将函数切换到较旧的执行速度较慢的模式,该模式使用locals()dict作为局部变量的规范表示。
如果locals()被称为外函数返回实际的字典,它是当前的命名空间。命名空间进一步的变化被反映在字典中,并到词典中的变化被反映在名称空间:

class Test(object):    a = ''one''    b = ''two''    huh = locals()    c = ''three''    huh[''d''] = ''four''    print huh

给我们:

{  ''a'': ''one'',  ''b'': ''two'',  ''c'': ''three'',  ''d'': ''four'',  ''huh'': {...},  ''__module__'': ''__main__'',}

到目前为止,我所说的所有事情locals()也适用于vars()…这里是不同的: vars()接受单个对象作为其参数,如果给它一个对象,它将返回该__dict__对象的。对于典型的对象,__dict__大多数属性数据都存储在该对象中。这包括类变量和模块全局变量:

class Test(object):    a = ''one''    b = ''two''    def frobber(self):        print self.ct = Test()huh = vars(t)huh[''c''] = ''three''t.frobber()

这给了我们:

three

请注意,函数 __dict__是其属性名称空间,而不是局部变量。对于一个函数来说__dict__,存储局部变量是没有意义的,因为递归和多线程意味着一个函数可以同时有多个调用,每个调用都有自己的局部变量:

def f(outer):    if outer:        f(False)        print(''Outer call locals:'', locals())        print(''f.__dict__:'', f.__dict__)    else:        print(''Inner call locals:'', locals())        print(''f.__dict__:'', f.__dict__)f.x = 3f(True)

这给了我们:

Inner call locals: {''outer'': False}f.__dict__: {''x'': 3}Outer call locals: {''outer'': True}f.__dict__: {''x'': 3}

在这里,f递归调用本身,因此内部和外部调用重叠。每个调用时都会看到自己的局部变量locals(),但是两个调用都看到相同的f.dict,并且其中f.__dict__没有任何局部变量。

关于Python字典:keys和values的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于37-python基础-python3-字典的常用方法-keys()-values()-items()、Django:使用values()和get_FOO_display()吗?、Enum#values()是否在每次调用时分配内存?、globals(),locals()和vars()之间有什么区别?的相关知识,请在本站寻找。

本文标签: