Это легко объясняется:
Итак:
def x(a=0, b=[], c=[], d=0):
a = a + 1
b = b + [1]
c.append(1)
print a, b, c
a
не изменяется - каждый вызов назначения создает новый объект int - печатается новый объект b
не изменяется - новый массив создается из значения по умолчанию и печатается c
изменения - операция выполняется на одном и том же объекте - и печатается Вы можете использовать regex для разделения.
Вот ссылка на регулярное выражение в javascript http://www.w3schools.com/jsref/jsref_obj_regexp.asp
Вот ссылка на другую запись, в которой автор использовал regex для split Javascript не будет разбиваться с использованием regex
. Из первой ссылки, если вы заметили, может создавать регулярное выражение, используя
?! n Соответствует любой строке, за которой не следует определенная строка n
[,]!\\
В случае необходимости также удалить обратную косую черту:
var test='a\\.b.c';
var result = test.replace(/\\?\./g, function (t) { return t == '.' ? '\u000B' : '.'; }).split('\u000B');
//result: ["a.b", "c"]
Поскольку регулярные выражения в JavaScript не поддерживают lookbehinds , я не собираюсь готовить гигантский взлом, чтобы имитировать это поведение. Вместо этого вы можете просто split()
на всех запятых (,
), а затем приклеить фрагменты, которые не должны были быть разделены в первую очередь.
Quick 'n' dirty demo :
var str = 'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv'.split(','), // Split on all commas
out = []; // Output
for (var i = 0, j = str.length - 1; i < j; i++) { // Iterate all but last (last can never be glued to non-existing next)
var curr = str[i]; // This piece
if (curr.charAt(curr.length - 1) == '\\') { // If ends with \ ...
curr += ',' + str[++i]; // ... glue with next and skip next (increment i)
}
out.push(curr); // Add to output
}
"ab\\,c\\,ed,fg"
. Изменить: for (var i = 0, j = str.length - 1; i < j; i++) {
на: while (var i = 0, j = str.length - 1; i < j; i++) {
, чтобы исправить эту проблему.
– DLKJ
9 September 2013 в 12:36
Еще один уродливый хак вокруг отсутствия задержек:
function rev(s) {
return s.split('').reverse().join('');
}
var s = 'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv';
// Enter bizarro world...
var r = rev(s);
// Split with a look-ahead
var rparts = r.split(/,(?!\\)/);
// And put it back together with double reversing.
var sparts = [ ];
while(rparts.length)
sparts.push(rev(rparts.pop()));
for(var i = 0; i < sparts.length; ++i)
$('#out').append('<pre>' + sparts[i] + '</pre>');
Демо: http://jsfiddle.net/ambiguous/QbBfw/1/
Я не думаю, что сделаю это в реальной жизни, но это работает, даже если это заставляет меня чувствовать себя грязным. Считайте это любопытством, а не тем, что вы действительно должны использовать.
~
? – Ovi 7 September 2011 в 08:20~
. Он должен быть чем-то (даже чем-то длиннее, чем~
), что вы уверены, что не появится в цепочке, которая разделяется, потому что на следующем шаге (после замены) мы разделим строку, используя этот символ (ы). – WTK 7 September 2011 в 08:22\,
как экранированную двоеточие и производит из нее просто двоеточие! Другими словами, если вы не избежите обратной косой черты, javascript видит это:a\,bcde,fgh,ijk\,lmno,pqrst\,uv
как этоa,bcde,fgh,ijk,lmno,pqrst,uv
. – WTK 7 September 2011 в 08:30