Очень подробное объяснение о копировании, прохождении и сравнении по значению и по ссылке содержится в в этой главе книги «JavaScript: окончательное руководство».
До мы оставляем тему манипуляции объектами и массивами по ссылке, нам нужно прояснить точку номенклатуры. Фраза «пройти по ссылке» может иметь несколько значений. Для некоторых читателей фраза относится к методу вызова функции, которая позволяет функции назначать новые значения своим аргументам и изменять эти измененные значения вне функции. Это не значит, что термин используется в этой книге. Здесь мы имеем в виду просто, что ссылка на объект или массив - не сам объект - передается функции. Функция может использовать ссылку для изменения свойств объекта или элементов массива. Но если функция перезаписывает ссылку ссылкой на новый объект или массив, эта модификация не видна вне функции. Читатели, знакомые с другим значением этого термина, могут предпочесть сказать, что объекты и массивы передаются по значению, но переданное значение на самом деле является ссылкой, а не самим объектом.
One вещь, которую я до сих пор не могу понять. Проверьте код ниже. Любые мысли?
function A() {} A.prototype.foo = function() { return 'initial value'; } function B() {} B.prototype.bar = A.prototype.foo; console.log(A.prototype.foo()); //initial value console.log(B.prototype.bar()); //initial value A.prototype.foo = function() { return 'changed now'; } console.log(A.prototype.foo()); //changed now console.log(B.prototype.bar()); //Why still 'initial value'???
>>> a=[1,2,3]
>>> a=[str(i) for i in a ]
>>> s=a[0]
>>> for i in a[1:-1]: s="%s,%s"%(s,i)
...
>>> s=s+","+a[-1]
>>> s
'1,2,3'
def stringTokenizer(sentense,delimiters):
list=[]
word=""
isInWord=False
for ch in sentense:
if ch in delimiters:
if isInWord: # start ow word
print(word)
list.append(word)
isInWord=False
else:
if not isInWord: # end of word
word=""
isInWord=True
word=word+ch
if isInWord: # end of word at end of sentence
print(word)
list.append(word)
isInWord=False
return list
print (stringTokenizer (u "привет парни! я вам стихами, может быть, еще отвечу", ",!"))
A ','.join
, как было предложено в других ответах, является типичным решением Python; нормальный подход, который до сих пор я не вижу ни в одном из ответов,
print ','.join(str(x) for x in a)
известен как выражение генератора или ген xp.
Если вы предпочитаете цикл (или нужен один для других целей, если вы делаете больше, чем просто печать на каждом элементе, например), есть, конечно, также отличные альтернативы:
for i, x in enumerate(a):
if i: print ',' + str(x),
else: print str(x),
это первый переключатель (работает для любого итеративного a, списка или другого), поэтому он помещает запятую перед каждым элементом, кроме первого. Переключатель последнего времени немного менее изящный, и он работает только для итераций, у которых есть len()
(не для полностью общих):
for i, x in enumerate(a):
if i == len(a) - 1: print str(x)
else: print str(x) + ',',
В этом примере также используется последний переключатель для завершения строки, когда она печатает последний элемент.
Встроенная функция enumerate очень часто полезна и стоит иметь в виду!
join
не автоматически конвертирует ints в строки, поэтому это не сработает.
– Sasha Chedygov
8 March 2010 в 06:20
Это то, что join
для.
','.join([str(elem) for elem in a])
TypeError: sequence item 0: expected string, int found.
Он не работает для ввода образца.
– Ponkadoodle
8 March 2010 в 04:30
[]
s, и он создаст генератор, который будет работать так же хорошо, не создавая (потенциально большой) ненужный временный список.
– Chris Lutz
8 March 2010 в 04:49
Есть два варианта:
Вы можете напрямую распечатать ответ, используя print(*a, sep=',')
, это будет использовать разделитель как «,» вы получите ответ как:
1,2,3
и еще один вариант:
print(','.join(str(x) for x in list(a)))
, это приведет к повторному перечню списка и печати (a) и печати вывода как
1,2,3
str
. – Chris Lutz 8 March 2010 в 04:29