我的列表值更改不正确 - python
my list value changing incorrectly - python
我正在尝试生成万事达卡卡号。
要求 :
第一个元素必须是 5
第二个元素必须介于 1 和 5 之间
最后一个元素必须是从 luhn 算法返回的 lcheck 数字。
我有luhn算法的校验位功能,目前一切正常。
但是当我在 generateMasterCard 函数中将我的卡号参数提供给 generateCheckDigit 函数时,我的卡号被乘以 2 返回,在 luhn 算法中相隔一个元素。
抱歉我的英语不好
代码如下:
def generateCheckDigit(numbers):
if len(numbers)%2 == 1:
for i in range(0,len(numbers),2):
numbers[i] *= 2
else:
for i in range(1,len(numbers),2):
numbers[i] *= 2
check_digit = (sum(numbers)*9) % 10
return check_digit
def generateMasterCard():
card_number = [5, rd.randint(1,5)]
for i in range(13):
card_number.append(rd.randint(0,9))
print(f"first number : {card_number}")
check_digit = generateCheckDigit(card_number)
card_number.append(check_digit)
return card_number
输出:
first number : [5, 4, 1, 4, 0, 8, 4, 8, 0, 4, 2, 8, 8, 2, 9]
[10, 4, 2, 4, 0, 8, 8, 8, 0, 4, 4, 8, 16, 2, 18, 4]
您可以import copy
并将generateCheckDigit(copy.copy(card_number))
用作
Alexey Larionov 在评论中说“在 Python 中,如果您向函数传递一些复杂的值,例如 class 实例、列表、字典等,那么您的函数可以自由修改它。在您的情况下,您可以这样做操作 numbers[i] *= 2 并更改您传递的列表”。传递副本可以避免这种情况。
我正在尝试生成万事达卡卡号。 要求 : 第一个元素必须是 5 第二个元素必须介于 1 和 5 之间 最后一个元素必须是从 luhn 算法返回的 lcheck 数字。
我有luhn算法的校验位功能,目前一切正常。 但是当我在 generateMasterCard 函数中将我的卡号参数提供给 generateCheckDigit 函数时,我的卡号被乘以 2 返回,在 luhn 算法中相隔一个元素。
抱歉我的英语不好
代码如下:
def generateCheckDigit(numbers):
if len(numbers)%2 == 1:
for i in range(0,len(numbers),2):
numbers[i] *= 2
else:
for i in range(1,len(numbers),2):
numbers[i] *= 2
check_digit = (sum(numbers)*9) % 10
return check_digit
def generateMasterCard():
card_number = [5, rd.randint(1,5)]
for i in range(13):
card_number.append(rd.randint(0,9))
print(f"first number : {card_number}")
check_digit = generateCheckDigit(card_number)
card_number.append(check_digit)
return card_number
输出:
first number : [5, 4, 1, 4, 0, 8, 4, 8, 0, 4, 2, 8, 8, 2, 9]
[10, 4, 2, 4, 0, 8, 8, 8, 0, 4, 4, 8, 16, 2, 18, 4]
您可以import copy
并将generateCheckDigit(copy.copy(card_number))
用作
Alexey Larionov 在评论中说“在 Python 中,如果您向函数传递一些复杂的值,例如 class 实例、列表、字典等,那么您的函数可以自由修改它。在您的情况下,您可以这样做操作 numbers[i] *= 2 并更改您传递的列表”。传递副本可以避免这种情况。