Python 为什么我不能覆盖默认参数?
考虑以下代码:Python 为什么我不能覆盖默认参数?,python,python-3.x,Python,Python 3.x,考虑以下代码: import pickle def open_file(fname, fname1 = None): # returns a new OPEN file if fname1: while fname == fname1: f_name = input("File already open, filename: ") f = None while not f: try:
import pickle
def open_file(fname, fname1 = None):
# returns a new OPEN file
if fname1:
while fname == fname1:
f_name = input("File already open, filename: ")
f = None
while not f:
try:
f = open(fname, "rb")
except IOError:
fname = input("File not found, filename: ")
print(fname, "open")
return f
def get_2cubes():
a_name = input("\nWhat is the name of the first cube's file? ")
a_file = open_file(a_name)
#a_cube = pickle.load(a_file)
a_file.close()
b_name = input("\nWhat is the name of the second cube's file? ")
b_file = open_file(b_name, a_name)
#b_cube = pickle.load(b_file)
b_file.close()
#return a_cube, b_cube
get_2cubes()
该代码旨在仅当第二个文件不是第一个文件时才打开该文件
在open_文件中,第一个文件的名称由fname1表示。如果本例中第二个文件的名称与第一个文件的名称匹配,则系统将提示用户输入新名称
我为fname1参数提供了一个默认参数None,因为该函数有时仅用于打开一个文件,而不用于将其与另一个文件进行比较。但是,我似乎无法覆盖默认参数
get_2cubes第7行的a_name变量未被open_文件中的if fname1:条件识别,因此我可以打开同一文件两次。如何更正此问题?我认为您需要使用原始输入。否则,输入的文本将被视为变量名,因此将等于无。除非您使用的是Python 3,否则我认为您需要使用原始输入。否则,输入的文本将被视为变量名,因此将等于无。除非您使用的是Python 3,否则fname1=inputFile已经打开,filename:Ashwini的意思是,如果您的if有效且名称相等,那么您将有一个无限while循环,因为您正在为变量f_name赋值,并检查fname和fname1的相等性。但只有当用户继续尝试为第二个文件指定与第一个文件相同的名称时,它才会是无限的。您不会更新fname和fname1,因此它们将永远相等,直到CTRL+C将它们分开。您是否尝试过在open_file函数中放置断点并查看它正在执行的操作?fname1=inputFile已打开,filename:Ashwini的意思是,如果您的if有效且名称相等,然后,您将有一个无限的while循环,因为您正在为变量f_name赋值,并检查fname和fname1的相等性。但只有当用户继续尝试为第二个文件指定与第一个文件相同的名称时,它才会是无限的。你不会更新fname和fname1,所以它们将永远相等,直到CTRL+C将它们分开。你试过在open_文件函数中放置断点并查看它在做什么吗?是的,我从打印出来后就知道了,即使来自Java,我总是在v2和v3中使用括号。另外,我尝试了你的代码,在按照评论中的建议将f_name更改为fname1后,它似乎工作得很好。那么open_文件中对fname的其他三个引用呢?从形式正确性的角度来看,它们似乎很好。我已经更正了open_文件:它应该返回f和fname;然后,new_a_name是第二个open_文件调用中的第二个参数;第一个while循环在第二个while循环内移动,而不使用'if fname1'子句;而且f_名字的拼写错误也被纠正了。是的,我从印刷品中猜出来了,尽管来自Java,我总是在v2和v3中使用括号。另外,我尝试了你的代码,在按照评论中的建议将f_name更改为fname1后,它似乎工作得很好。那么open_文件中对fname的其他三个引用呢?从形式正确性的角度来看,它们似乎很好。我已经更正了open_文件:它应该返回f和fname;然后,new_a_name是第二个open_文件调用中的第二个参数;第一个while循环在第二个while循环内移动,而不使用'if fname1'子句;而且f_的名字输入错误被纠正了。