【问题标题】:Contradictory outputs in dictionary key value in for-loop mode in pythonpython中for循环模式下字典键值的矛盾输出
【发布时间】:2016-06-26 11:35:30
【问题描述】:

首先要理解收缩(在结尾段落中),您需要用鹰眼仔细观察这四个场景:
(如果发现任何愚蠢的错误,请忽略,了解问题所在)

第一个:

r={'A':'aa','B':'bb','C':'cc'}
print(r[A])#this gives error as "A" in not inside Quotation marks

第二个:

r={'A':'aa','B':'bb','C':'cc'}
print(r['A'])   #now there is no error in output result

第三:

r={'A':'aa','B':'bb','C':'cc'}
for xyz in r:
    print(r[A])   # again there will be error in output result 
                  # because "A" is not inside quotation marks.

第四:

r={'A':'aa','B':'bb','C':'cc'}
for xyz in r:
    print(r['A'])   #not no error will be there as "A" is inside  
                    #quotation marks

矛盾从这里开始循环

第 5 次:

 r={'A':'aa','B':'bb','C':'cc'}
 for xyz in r:
     print(xyz)       #output result come as A C B with no quotation 
                           mark, you can check to see

第六:

 r={'A':'aa','B':'bb','C':'cc'}
 for xyz in r:
     print(r[A])    # shows error in output as "A" is not inside  
                        # quotation marks

第 7 次:

 r={'A':'aa','B':'bb','C':'cc'}
 for xyz in r:
     print(r['A'])  #result comes out successfully as aa aa aa with new 
                         line inbetween

8:

r={'A':'aa','B':'bb','C':'cc'}
for xyz in r:
    print(r['xyz']) #result should come successfully as r['xyz'] means  
                          r['A'] or r['B'] or r['C'] in the loop
                         #but it shows error which by omitting the quotation      
                          mark of xyz show the result successful as shown in
                          9th scenario

9:

r={'A':'aa','B':'bb','C':'cc'}
for xyz in r:
    print(r[xyz])   #output result comes successfully as aa cc bb 
                             (check to see)

矛盾:在第 9 种情况下,字面上的 print(r[xyz]) 在 xyz 周围没有引号意味着 print(r[A]) 或 print(r[B]) 或 print(r[C]) 显示成功的输出结果,并且在第 8 种情况下 print(r['xyz']) 在其输出结果中显示错误。 现在这与以下内容相矛盾:

  • print(r[A]) 显示的第 1 种场景、第 3 种场景和第 6 种场景
    错误,因为“A”不在引号内...

  • 第二个场景,第4个场景和第7个场景,把“A”放在里面
    引号成功给出结果。

现在我的问题是引号还是不带引号??它有一个通用规则还是多个规则??

【问题讨论】:

  • 您混淆了字符串和变量。 r 中的键是字符串。您可以将这些字符串放在一个变量中,并使用该变量来查找相应的值。
  • 这里没有矛盾,只是对什么是变量,什么是字符串值的误解。引号构成一个字符串值。

标签: python dictionary key


【解决方案1】:

让我们把它分成几个阶段,看看是否有帮助。我假设你很高兴 for 循环 for xyz in r: 相当于做:

xyz = 'A'
# Do the contents of the loop
xyz = 'B'
# Do the contents of the loop
xyz = 'C'
# Do the contents of the loop

所以为了让例子更简单,我们可以看一下这个案例:

r = {'A':'aa', 'B':'bb', 'C':'cc'}
xyz = 'A'   

现在,如果我们这样做:

print(r[xyz])

这做了几件事。

  1. xyz 不在引号中,因此 Python 将其视为某事物的标签(或“名称”)
  2. xyz 确实是个标签!它是一个包含值'A' 的变量,一个字符串。
  3. Python 交换了xyz,所以我们要执行的打印语句现在看起来像print(r['A'])
  4. Python 检查字符串'A' 是否是字典r 中的键。是的!
  5. 'A' 的条目的值是 'aa',也是一个字符串,所以打印语句现在看起来像这样:print('aa')。没有什么可查的,所以这就是 python 执行的。

如果我们尝试这样做:

print(r['xyz'])
  1. 'xyx' 是一个文字字符串,因此 python 尝试查看 r 中是否有一个条目具有键 'xyz'
  2. r中没有叫'xyz'的键,所以python显示错误

接下来:

print(r[A])
  1. A 不在引号中,因此 Python 将其视为某事物的标签
  2. 程序中不存在名称为A的标签,因此Python无法查找它的值!
  3. Python 显示错误,因为它无法查找 A 的值

希望这可以消除报价差异。

【讨论】:

  • xyz 不等于“A”或“B”或“C”。但是 xyz = A 或 B 或 C,没有引号。运行我的第 5 个场景的程序,你会看到 xyz 的值
  • 我完全不同意。字典中的键是字符串'A''B''C',它们不是不带引号的名称ABC。这意味着xyz 获取字符串,用引号引起来。
  • 您的第 5 个场景不会打印出引号,因为它们是 your script 判断某事物是否为字符串的方式。如果您执行print("hello"),您看不到"hello",您只会看到hello - 没有引号。但是print只能显示字符串
  • 我根本不会这么说。我说它看起来像print(r['A'])带有引号。
  • "如果你做 print("hello") 你看不到 "hello",你的这个例子让我明白了!!我误解了!!
【解决方案2】:

xyz 是对象的名称(或标签)。循环将名称 xyz 指向字典中的每个键。所以使用xyz作为key就可以了,因为它的值实际上是'A',然后是'B',然后是'C'

'xyz' 是用作字典键的字符串。 字典没有键 'xyz' 所以失败。

A 是一个未绑定的名称。它尚未被定义为指向任何对象。当您说r[A] 时,口译员不知道您在说什么。它知道r 的名字是什么;它指向一个字典对象。但A 是未知的。

'A' 是一个字符串。字典中有键 'A',因此匹配且不会失败。

编辑:

在你说的问题中:

r['xyz'] 表示循环中的r['A']r['B']r['C']

这不是真的。

每次循环,r['xyz'] 表示r['xyz']

这对字典说:

"你有一个值为'xyz'的键吗?

字典查看它的键,它们是'A''B''C',然后说:

“不,没有密钥'xyz'

【讨论】:

  • 请注意,我在注释部分的第 7 个场景中输入错误,其输出结果实际上是 aa aa aa,它们之间有新行(不是 A A A,因为我输入错误,它们之间有新行)。我现在将对其进行编辑。我很快就会在几分钟内回复我。
  • (i)-- 第一要明确,在循环中,xyz 充当不带引号的键(参见第 5 种情况的结果),如此证明。现在.........(ii) 在第 7 种情况下, print(r['A']) 的输出是 aa aa aa,这证明了密钥(作为此处的密钥 A)应该在引号内以获得它的值输出,否则将弹出错误,如第 6 节........ 以同样的方式, print(r['xyz']) (其中 xyz 充当不带引号的键,如第 1 段所述) 应该成功显示其值的输出结果,没有任何错误,如上面解释的第 7 种情况
  • 'xyz'xyz 不同。 'xyz' 是一个文字字符串对象。 xyz 是一个对象的名称,它的值可以是 'A' 例如。 'xyz' 不是字典中键的值。 'A' 是字典中某个键的值。
  • 我知道 'xyz' 和 xyz 是不同的。我只是试图以不那么技术性的方式讨论它!我知道这两个是完全不同的!!...你的注意力转移到了不同​​的轨道上!
  • 我不认为他的注意力转移到了不同​​的轨道上。键是'A',一个字符串。如果变量xyz 包含字符串'A',那么执行r[xyz] 将使用变量xyz 作为键。如果您使用r['xyz'],那么您正在查找不存在的key 'xyz'
【解决方案3】:

第 9 和第 8 场景与之前的场景并不矛盾。在 python 中,当您声明如下的 for 语句时

mylist = ["a", "b", "c"]
for each in mylist:
    print(each)

在这个语句中 print 语句执行了 3 次。首先each 等于a。第二个等于b,第三个等于c。因此,在 for 循环中,for 之后的单词等于列表中的元素。 当你尝试执行时

 for each in mylist:
        print(a)

它不起作用,因为您试图打印一个不存在的变量a。在您的情况下,当您编写 xyz 时,您使其等于字典中的键,因此您可以编写 print(r[xyz])

在第 8 种情况下,您试图获取与键 xyz 关联的值。由于您没有密钥xyz,您的代码将失败。

在您的第 5 个场景中,您的 print(xyz) 返回 A 和 B 和 C。如果您尝试打印类似“Hello World”的内容,它将写出 Hello World 而不是“Hello World”。它写出 Hello World”的事实将不改变 print 具有“Hello World”参数的事实。

为了进一步了解,您可以对此进行测试。

for each in mylist:
    if each=="a":
        print(each)

这将打印一次证明每个都等于“a”而不是a。再举一个例子来澄清事情。 您写道,当您打印 xyz 时,您得到 A 结果,因此“xyz”应该是“A”。这是错误的。当您在“”内写一些东西时,这意味着它们将是一个字符串,如果它们不会调用它们的值他们有一个。测试一下。

val=3
if "val"=="3":
    print ("something")

这不会打印一些东西,因为“val”等于“val”而不是“3”

结论:当你写 print(r[xyz]) 时,它并不意味着 print(r[A])。它意味着 print(r["A"])

【讨论】:

  • 你误解了我的结论部分矛盾,弄错了!!
  • (i)-- 第一要明确的是,在循环中,xyz 充当不带引号的键(参见第 5 种情况的结果)............ ..(ii) 现在这里是缓存,在第 7 个场景中,print(r['A']) 的输出是 aa aa aa,这证明了键(作为这里的键 A)应该在引号内以获得它的值输出,否则会像第 6 条一样弹出错误......以同样的方式, print(r['xyz']) (其中 xyz 充当不带引号的键,如第 1 段所述)应该成功显示其值的输出结果,没有任何错误,如上面解释的第 7 种情况
  • @Andrew 请不要复制和粘贴 cmets。我们不是机器。
  • 我在回答中向您解释过,但我会再次解释。当您编写 print(r["A"]) 时,您希望字典 r 中与“A”相关联的值.那个值是aa,所以它是正确的。当你写print(r [“xyz”])时,你想要字典r中与“xyz”相关联的值。但是你没有一个名为“xyz”的键。当你在字典中用 for 定义了一些东西,它变成了键。我知道在你的第 5 种情况下,你认为 xyz 等于 A 而不是“A”,但事实并非如此。当你尝试在python它写A但它等于“A”。
  • 我正在更新我的答案,为您提供更好、更清晰的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多