我是靠谱客的博主 粗犷刺猬,最近开发中收集的这篇文章主要介绍python字典变量的定义中错误的是_静态类范围内的python嵌套字典理解:未定义变量...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

I've got this code:

class Chars:

char_to_number = {

'a': ['1'],

'b': ['2'],

'c': ['3', '6'],

'd': ['4', '5'],

}

number_to_char = {

number: char

for char in char_to_number

for number in char_to_number[char]

}

Now this code returns an error as such:

name 'char_to_number' is not defined

Now it looks like python could not parse the nested dictionary comprehension. It looks like the inner scope was not updated with the outer scope, which defined the char_to_number variable.

I've solved this code with this implementation:

class Chars:

char_to_number = {

'a': ['1'],

'b': ['2'],

'c': ['3', '6'],

'd': ['4', '5'],

}

number_to_char = {

number: char

for char, optional_numbers in char_to_number.items()

for number in optional_numbers

}

Here I'm not using the char_to_number variable in the inner loop, and python succeeded to parse this code.

Of course, all of that happens in the global scope of the class.

In the global python scope, it doesn't happen:

char_to_number = {

'a': ['1'],

'b': ['2'],

'c': ['3', '6'],

'd': ['4', '5'],

}

number_to_char = {

number: char

for char in char_to_number

for number in char_to_number[char]

}

Does anyone have any clue about that?

解决方案

The essence of the problem is not the nesting. It's the fact that there's a flaw in the scope in comprehensions used within classes. To understand why this looks like a flaw, take the code from the original question by @gal-ben-david and put it in a function (print statement and function call added to generate output and confirm that this code works, at least in Python 3.6.6):

def Chars():

char_to_number = {

'a': ['1'],

'b': ['2'],

'c': ['3', '6'],

'd': ['4', '5'],

}

number_to_char = {

number: char

for char in char_to_number

for number in char_to_number[char]

}

print(number_to_char)

To understand why nesting is not the problem, take a look at the example in the explanation for this "limitation", in the section on the execution model of the Python language reference:

class A:

a = 42

b = list(a + i for i in range(10))

The variable "a" is not in the scope of the comprehension if these two lines appear in a class, but it would be in a function or module. I call that a bug. To formalize the limitation a bit: when a comprehension is used in a class, only the outermost iterator in the for loop(s) is accessible inside the comprehension, but no other variables from outside the comprehension are accessible.

Comprehensions are presented as being equivalent to for loops, but obviously they aren't. While the nature of this flaw is being debated (bug or not bug), I've submitted a ticket to the developers about the documentation of comprehensions, which really should mention this problem prominently.

I don't have enough points to comment on @armatita's response, but note that it's a workaround and not equivalent to what the original code is trying to do, because it makes char_to_number and number_to_char attributes of each class instance and not of the class itself. I landed on this page because I was trying to assign class attributes.

最后

以上就是粗犷刺猬为你收集整理的python字典变量的定义中错误的是_静态类范围内的python嵌套字典理解:未定义变量...的全部内容,希望文章能够帮你解决python字典变量的定义中错误的是_静态类范围内的python嵌套字典理解:未定义变量...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部