为什么它从列表[-1]而不是列表[0]开始计算此列表中的元素? (Python 3)

时间:2016-06-17 12:41:57

标签: python list python-3.x indexing

(如果我先显示代码,则更容易解释)

import random
inventory = 100
while True:
    print('inventory: $' + str(inventory))
    print('how much do you wager?')
    wager = input()
    keys = ['a', 'b']
    cA = random.sample(keys, 1)
    print('pick "a" or "b"')
    guess = input()
    if guess == cA[0]
        inventory += int(wager)
    elif guess == cA[1]: # <--------------- 
        inventory -= int(wager)
    else:
        print('ERROR')

所以我做了这个相当简单的猜测/赌博游戏,但是当我跑它时说cA [1]超出了范围(“IndexError:列表索引超出范围”),这使我感到困惑,因为我知道列表应该从列表[0],列表[1]等开始计数 然后我将cA [1]更改为cA [-1]并确实返回了一封信。奇怪(我认为)当我加入

print(keys[1]) 

它确实按预期返回“b”,所以我不明白为什么键[1]存在但是当键和cA都有2个元素时cA [1]不存在。为什么会这样做,有没有办法修复/改变它?

2 个答案:

答案 0 :(得分:4)

您的列表中只包含一个元素:

cA = random.sample(keys, 1)

您要求提供长度为1的随机样本。

-1有效,因为这是一个相对于结尾的索引。对于长度为1的列表,listobj[-1]listobj[0]是同一个对象;最后一个元素也是第一个元素。

keys是包含两个元素的列表,因此keys[0]keys[1]都存在。

答案 1 :(得分:0)

import random
inventory = 100
while True:
    print('inventory: $' + str(inventory))
    print('how much do you wager?')
    wager = input()
    keys = ['a', 'b']
    cA = random.sample(keys, 1)
    print('pick "a" or "b"')
    guess = input()
    if guess == cA      <------------ cA has the element that is the correct wager
        inventory += int(wager)     
    else:
        inventory -= int(wager)

我认为这就是你想要的。