def fun( key=False,*var):
if key is False:
print(var)
return 0
print("Key is true")
return 0
fun(1,2,3)
我没有在fun(1,2,3)中传递key的值。因此,密钥的默认值即 key = False 。但输出是:
Key is true
这些案件是矛盾的。 为什么会这样?
答案 0 :(得分:3)
但您确实为1
传递了key
。 [2,3]
为*var
。{/ p>
您提供给函数的位置参数将按顺序绑定到参数变量 。关键字参数是一个例外,但是在调用函数时你必须明确地命名它们(并且你没有这样做)。
因此,您必须颠倒顺序并在结尾处放置关键字参数key
。但这在Python 2中将是一个无效的语法。标准解决方案(在Python 2和Python 3 中都适用)是切换到关键字参数字典并仅在{{{}时为参数提供默认值3}}他们:
>>> def fun(*var, **kwargs):
... key = kwargs.pop('key', False)
... print(key)
...
>>> fun(1,2,3)
False
>>> fun(1,2,3, key=True)
True
自Python 3.0(请参阅popping获取新语法)以来,可以在位置参数列表后面包含关键字参数,如下所示:
>>> def fun(*var, key=False):
... print(key)
...
>>> fun(1,2,3)
False
>>> fun(1,2,3, key=True)
True
答案 1 :(得分:0)
这里的问题是Python会将key
中的第一个参数变为1
,因为这是第一个也是唯一的位置参数。除了这一点之外,它是可选的这一事实。由于False
显然不是var
,因此它不会打印Key is true.
,而是打印key
。如果您希望仅fun(key=True)
之类的内容访问def fun(*var,**kwargs):
if "key" in kwargs and kwargs["key"] is False:
print(var)
return 0
print("Key is true")
return 0
fun(1,2,3)
fun(1,2,key=False)
,则需要使用此代码。
public class demo {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String w=sc.nextLine();
char arr[]=w.toCharArray();
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
答案 2 :(得分:0)
它正如预期的那样工作。只是为了调试,添加了一个打印声明。
def fun( key=False,*var):
print key, var
if key is False:
print(var)
return 0
print("Key is true")
return 0
fun(1,2,3)
快速检查命令行......解释。
>>> print True == 1
True
>>>
>>> 1 is False
False
>>>
这就是原因,控制没有进入if语句。
答案 3 :(得分:0)
def fun(*var, key=False):
if key is False:
print(var)
return 0
print("Key is true")
return 0
fun(1,2,3)
fun(1,2,3, key=True)
在任何函数声明中,如果你同时拥有位置和关键字参数,那么位置参数需要首先放在关键字参数上。
答案 4 :(得分:0)
默认参数应放在最后。 否则,它也将在默认参数中传递用于处理的参数。
public static class MemoryCacheHackExtensions
{
public static long GetApproximateSize(this MemoryCache cache)
{
var statsField = typeof(MemoryCache).GetField("_stats", BindingFlags.NonPublic | BindingFlags.Instance);
var statsValue = statsField.GetValue(cache);
var monitorField = statsValue.GetType().GetField("_cacheMemoryMonitor", BindingFlags.NonPublic | BindingFlags.Instance);
var monitorValue = monitorField.GetValue(statsValue);
var sizeField = monitorValue.GetType().GetField("_sizedRefMultiple", BindingFlags.NonPublic | BindingFlags.Instance);
var sizeValue = sizeField.GetValue(monitorValue);
var approxProp = sizeValue.GetType().GetProperty("ApproximateSize", BindingFlags.NonPublic | BindingFlags.Instance);
return (long)approxProp.GetValue(sizeValue, null);
}
}
输出:def fun(*var, key=False):
if key is False:
print(var)
return 0
print("Key is true")
return 0
fun(1,2,3)
(1, 2, 3)
输出:def fun(*var, key=False):
if key is False:
print(var)
return 0
print("Key is true")
return 0
fun(1, 2, 3, key=True)